﻿2026-05-16T05:05:51.0933190Z ##[group]Run pnpm verify:phase-5
2026-05-16T05:05:51.0933547Z [36;1mpnpm verify:phase-5[0m
2026-05-16T05:05:51.0967993Z shell: /usr/bin/bash -e {0}
2026-05-16T05:05:51.0968248Z env:
2026-05-16T05:05:51.0968494Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-16T05:05:51.0968831Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-16T05:05:51.0969070Z   SKIP_TRACE_CHECK: 1
2026-05-16T05:05:51.0969312Z ##[endgroup]
2026-05-16T05:05:51.4150913Z 
2026-05-16T05:05:51.4152107Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-16T05:05:51.4156876Z > node scripts/verify-phase-5.mjs
2026-05-16T05:05:51.4160545Z 
2026-05-16T05:05:51.4557602Z 
2026-05-16T05:05:51.4558543Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-16T05:05:51.4559557Z >>> pnpm verify:phase-4
2026-05-16T05:05:51.7856553Z 
2026-05-16T05:05:51.7857446Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-16T05:05:51.7858630Z > node scripts/verify-phase-4.mjs
2026-05-16T05:05:51.7859275Z 
2026-05-16T05:05:51.8176167Z 
2026-05-16T05:05:51.8176890Z === Workspace: typecheck ===
2026-05-16T05:05:51.8177795Z >>> pnpm -r typecheck
2026-05-16T05:05:52.1820419Z Scope: 5 of 6 workspace projects
2026-05-16T05:05:52.1881833Z packages/db typecheck$ tsc --noEmit
2026-05-16T05:05:52.1891238Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T05:05:55.1041548Z packages/game-logic typecheck: Done
2026-05-16T05:05:55.1050835Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T05:05:57.1031586Z packages/db typecheck: Done
2026-05-16T05:05:58.6291376Z packages/protocol typecheck: Done
2026-05-16T05:05:58.6297901Z apps/client typecheck$ tsc --noEmit
2026-05-16T05:05:58.6301237Z apps/server typecheck$ tsc --noEmit
2026-05-16T05:06:11.6801456Z apps/client typecheck: Done
2026-05-16T05:06:12.1199110Z apps/server typecheck: Done
2026-05-16T05:06:12.1306562Z 
2026-05-16T05:06:12.1307461Z === Lint: protocol-sync ===
2026-05-16T05:06:12.1308546Z >>> pnpm lint:protocol-sync
2026-05-16T05:06:12.4516480Z 
2026-05-16T05:06:12.4517631Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-16T05:06:12.4518986Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-16T05:06:12.4519677Z 
2026-05-16T05:06:12.4830919Z lint-protocol-sync: OK
2026-05-16T05:06:12.4959921Z 
2026-05-16T05:06:12.4960988Z === Lint: game-logic-purity ===
2026-05-16T05:06:12.4962072Z >>> pnpm lint:game-logic-purity
2026-05-16T05:06:12.8256800Z 
2026-05-16T05:06:12.8257995Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-16T05:06:12.8259377Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-16T05:06:12.8260348Z 
2026-05-16T05:06:12.8601361Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-16T05:06:12.8736577Z 
2026-05-16T05:06:12.8737584Z === Lint: better-auth-schema-sync ===
2026-05-16T05:06:12.8738567Z >>> pnpm lint:better-auth-schema-sync
2026-05-16T05:06:13.1998293Z 
2026-05-16T05:06:13.1999501Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-16T05:06:13.2001072Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-16T05:06:13.2001818Z 
2026-05-16T05:06:14.7673381Z lint-better-auth-schema-sync: OK
2026-05-16T05:06:14.7803417Z 
2026-05-16T05:06:14.7804263Z === Lint: rate-limit-budgets ===
2026-05-16T05:06:14.7805154Z >>> pnpm lint:rate-limit-budgets
2026-05-16T05:06:15.1051964Z 
2026-05-16T05:06:15.1053193Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-16T05:06:15.1055252Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-16T05:06:15.1056005Z 
2026-05-16T05:06:15.1392628Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-16T05:06:15.1523180Z 
2026-05-16T05:06:15.1524125Z === Lint: no-clipboard-rce ===
2026-05-16T05:06:15.1525089Z >>> pnpm lint:no-clipboard-rce
2026-05-16T05:06:15.4818578Z 
2026-05-16T05:06:15.4819822Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-16T05:06:15.4821680Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-16T05:06:15.4822383Z 
2026-05-16T05:06:15.5203700Z lint-no-clipboard-rce: OK (22 file(s) clean)
2026-05-16T05:06:15.5346663Z 
2026-05-16T05:06:15.5347574Z === Lint: room-layout ===
2026-05-16T05:06:15.5348496Z >>> pnpm lint:room-layout
2026-05-16T05:06:15.8762249Z 
2026-05-16T05:06:15.8763337Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-16T05:06:15.8764718Z > node tools/scripts/lint-room-layout.mjs
2026-05-16T05:06:15.8765404Z 
2026-05-16T05:06:15.9137351Z lint-room-layout: OK
2026-05-16T05:06:15.9268001Z 
2026-05-16T05:06:15.9268950Z === ADR 0004 lint ===
2026-05-16T05:06:15.9269963Z >>> pnpm lint:adr:0004
2026-05-16T05:06:16.2512971Z 
2026-05-16T05:06:16.2514045Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-16T05:06:16.2515549Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-16T05:06:16.2516565Z 
2026-05-16T05:06:16.2821653Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T05:06:16.2958564Z 
2026-05-16T05:06:16.2959438Z === Drizzle: emit-check ===
2026-05-16T05:06:16.2960537Z >>> pnpm db:emit-check
2026-05-16T05:06:16.6420787Z 
2026-05-16T05:06:16.6426066Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-16T05:06:16.6429128Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-16T05:06:16.6431743Z 
2026-05-16T05:06:17.1174597Z No config path provided, using default 'drizzle.config.ts'
2026-05-16T05:06:17.1176867Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-16T05:06:17.5001113Z 8 tables
2026-05-16T05:06:17.5001869Z accounts 8 columns 1 indexes 0 fks
2026-05-16T05:06:17.5006975Z audit_log 6 columns 0 indexes 2 fks
2026-05-16T05:06:17.5007803Z characters 9 columns 0 indexes 1 fks
2026-05-16T05:06:17.5008751Z inventory_items 4 columns 0 indexes 1 fks
2026-05-16T05:06:17.5009850Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-16T05:06:17.5011154Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-16T05:06:17.5012104Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-16T05:06:17.5012994Z sessions 5 columns 0 indexes 1 fks
2026-05-16T05:06:17.5013569Z 
2026-05-16T05:06:17.5014415Z No schema changes, nothing to migrate 😴
2026-05-16T05:06:17.6095835Z 
2026-05-16T05:06:17.6096663Z === Drizzle: schema-sync ===
2026-05-16T05:06:17.6097597Z >>> pnpm lint:schema-sync
2026-05-16T05:06:17.9332309Z 
2026-05-16T05:06:17.9333383Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-16T05:06:17.9337166Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-16T05:06:17.9339694Z 
2026-05-16T05:06:17.9618221Z OK
2026-05-16T05:06:17.9761866Z 
2026-05-16T05:06:17.9762760Z === Drizzle: source-comments ===
2026-05-16T05:06:17.9763583Z >>> pnpm lint:source-comments
2026-05-16T05:06:18.2969626Z 
2026-05-16T05:06:18.2973465Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-16T05:06:18.2974753Z > pnpm -C packages/db run lint:source-comments
2026-05-16T05:06:18.2975981Z 
2026-05-16T05:06:18.6328043Z 
2026-05-16T05:06:18.6329316Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-16T05:06:18.6330938Z > node scripts/check-source-comments.mjs
2026-05-16T05:06:18.6331608Z 
2026-05-16T05:06:18.6674233Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-16T05:06:18.6929252Z 
2026-05-16T05:06:18.6930355Z === Workspace: test ===
2026-05-16T05:06:18.6931230Z >>> pnpm -r test
2026-05-16T05:06:19.0228235Z Scope: 5 of 6 workspace projects
2026-05-16T05:06:19.0289176Z packages/db test$ vitest run
2026-05-16T05:06:19.0300121Z packages/game-logic test$ vitest run
2026-05-16T05:06:19.5537769Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T05:06:19.5561645Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T05:06:20.0104311Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T05:06:20.2612609Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-16T05:06:20.5239838Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:06:20.5752497Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T05:06:20.7857641Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:06:21.0358537Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:21.2810868Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:21.4812008Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:06:21.5192255Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:21.7412535Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:06:21.7472150Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T05:06:21.7481516Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T05:06:21.7502370Z packages/db test: [2m   Start at [22m 05:06:19
2026-05-16T05:06:21.7533852Z packages/db test: [2m   Duration [22m 2.19s[2m (transform 182ms, setup 0ms, import 1.50s, tests 31ms, environment 1ms)[22m
2026-05-16T05:06:21.7787975Z packages/db test: Done
2026-05-16T05:06:21.7804099Z packages/protocol test$ vitest run
2026-05-16T05:06:21.7876248Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:22.0567472Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:06:22.3011258Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:06:22.3718251Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T05:06:22.5472279Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:06:22.8426228Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-16T05:06:22.8802271Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:06:22.8871162Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T05:06:22.8891558Z packages/game-logic test: [2m      Tests [22m [1m[32m60 passed[39m[22m[90m (60)[39m
2026-05-16T05:06:22.8918980Z packages/game-logic test: [2m   Start at [22m 05:06:19
2026-05-16T05:06:22.8942037Z packages/game-logic test: [2m   Duration [22m 3.32s[2m (transform 273ms, setup 0ms, import 558ms, tests 114ms, environment 2ms)[22m
2026-05-16T05:06:22.9247235Z packages/game-logic test: Done
2026-05-16T05:06:23.0645999Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:06:23.2525658Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:06:23.4188385Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:06:23.4218151Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T05:06:23.4230781Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T05:06:23.4232382Z packages/protocol test: [2m   Start at [22m 05:06:22
2026-05-16T05:06:23.4234305Z packages/protocol test: [2m   Duration [22m 1.04s[2m (transform 147ms, setup 0ms, import 319ms, tests 47ms, environment 1ms)[22m
2026-05-16T05:06:23.4539623Z packages/protocol test: Done
2026-05-16T05:06:23.4545824Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T05:06:23.4549005Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T05:06:24.0348722Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T05:06:24.1128008Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T05:06:25.1667852Z apps/server test: {"level":30,"time":1778907985162,"pid":4831,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T05:06:25.1712073Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 771[2mms[22m[39m
2026-05-16T05:06:25.1728820Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 650[2mms[22m[39m
2026-05-16T05:06:26.4066097Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T05:06:26.4069203Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T05:06:26.4529353Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 52[2mms[22m[39m
2026-05-16T05:06:26.4890876Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 262[2mms[22m[39m
2026-05-16T05:06:26.9502362Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 144[2mms[22m[39m
2026-05-16T05:06:27.8434851Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T05:06:27.8437418Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1AHNFe/rebno.db
2026-05-16T05:06:27.8461541Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:06:27.8462942Z apps/server test: [run-migrations] OK
2026-05-16T05:06:27.8596799Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T05:06:27.8601926Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-gb3TKH/rebno.db
2026-05-16T05:06:27.8605533Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:06:27.8623557Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T05:06:27.8640791Z apps/server test: [run-migrations] OK
2026-05-16T05:06:27.8732971Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T05:06:27.8749234Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-PCWBM1/rebno.db
2026-05-16T05:06:27.8752633Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:06:27.8758019Z apps/server test: [run-migrations] OK
2026-05-16T05:06:27.8782008Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T05:06:27.8784211Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-PCWBM1/rebno.db
2026-05-16T05:06:27.8801382Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:06:27.8845733Z apps/server test: [run-migrations] OK
2026-05-16T05:06:27.8856751Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-16T05:06:27.9244444Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 109[2mms[22m[39m
2026-05-16T05:06:28.2171191Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 28[2mms[22m[39m
2026-05-16T05:06:28.5152146Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-16T05:06:28.8267214Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-16T05:06:29.1052728Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:06:29.2044896Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 165[2mms[22m[39m
2026-05-16T05:06:29.4307585Z apps/server test: {"level":40,"time":1778907989427,"pid":4966,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:06:29.4382465Z apps/server test: {"level":40,"time":1778907989431,"pid":4966,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:06:29.4389965Z apps/server test: {"level":40,"time":1778907989432,"pid":4966,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:06:29.4397342Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T05:06:29.6805095Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:06:30.5537231Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T05:06:30.5561949Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ encrypted .env [www.dotenvx.com]
2026-05-16T05:06:30.5563672Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T05:06:30.6132469Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 171[2mms[22m[39m
2026-05-16T05:06:31.2963841Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:31.5492664Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:31.5611865Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T05:06:31.5613288Z apps/server test: [2m      Tests [22m [1m[32m71 passed[39m[22m[90m (71)[39m
2026-05-16T05:06:31.5646323Z apps/server test: [2m   Start at [22m 05:06:24
2026-05-16T05:06:31.5666711Z apps/server test: [2m   Duration [22m 7.50s[2m (transform 589ms, setup 0ms, import 3.69s, tests 1.16s, environment 2ms)[22m
2026-05-16T05:06:31.6054211Z apps/server test: Done
2026-05-16T05:06:31.7278563Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 43[2mms[22m[39m
2026-05-16T05:06:32.4931713Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 81[2mms[22m[39m
2026-05-16T05:06:33.2650880Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-16T05:06:34.0308300Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 78[2mms[22m[39m
2026-05-16T05:06:34.7625443Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-16T05:06:35.4964305Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T05:06:36.2288899Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T05:06:36.9352835Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:37.6761583Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T05:06:38.4002588Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T05:06:39.1921051Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:06:39.9190825Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T05:06:40.6192439Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:06:41.3288389Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:06:42.0245056Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:42.7184917Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:43.4490702Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:06:44.1738247Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:06:44.8912035Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:06:45.5838537Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:06:46.2883401Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:06:46.9906947Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:06:47.6725210Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:06:48.3962191Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:06:49.1398696Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:06:49.8596772Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:06:50.5715727Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:06:50.5952070Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T05:06:50.5965090Z apps/client test: [2m      Tests [22m [1m[32m216 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (220)[39m
2026-05-16T05:06:50.5966524Z apps/client test: [2m   Start at [22m 05:06:24
2026-05-16T05:06:50.5968489Z apps/client test: [2m   Duration [22m 26.48s[2m (transform 998ms, setup 69ms, collect 1.73s, tests 1.21s, environment 15.43s, prepare 2.96s)[22m
2026-05-16T05:06:50.7360798Z apps/client test: Done
2026-05-16T05:06:50.7453102Z 
2026-05-16T05:06:50.7455382Z verify-phase-4: OK (12 steps green)
2026-05-16T05:06:50.7593534Z 
2026-05-16T05:06:50.7594465Z === Workspace: typecheck ===
2026-05-16T05:06:50.7595472Z >>> pnpm -r typecheck
2026-05-16T05:06:51.0852676Z Scope: 5 of 6 workspace projects
2026-05-16T05:06:51.0913668Z packages/db typecheck$ tsc --noEmit
2026-05-16T05:06:51.0922867Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T05:06:53.9603435Z packages/game-logic typecheck: Done
2026-05-16T05:06:53.9631142Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T05:06:56.2213783Z packages/db typecheck: Done
2026-05-16T05:06:57.6127310Z packages/protocol typecheck: Done
2026-05-16T05:06:57.6134621Z apps/client typecheck$ tsc --noEmit
2026-05-16T05:06:57.6137599Z apps/server typecheck$ tsc --noEmit
2026-05-16T05:07:10.9271485Z apps/client typecheck: Done
2026-05-16T05:07:11.5771693Z apps/server typecheck: Done
2026-05-16T05:07:11.5878853Z 
2026-05-16T05:07:11.5879658Z === Lint: deploy-stack ===
2026-05-16T05:07:11.5880823Z >>> pnpm lint:deploy-stack
2026-05-16T05:07:11.9136199Z 
2026-05-16T05:07:11.9137276Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-16T05:07:11.9138323Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-16T05:07:11.9139024Z 
2026-05-16T05:07:11.9453730Z lint-deploy-stack: OK
2026-05-16T05:07:11.9587881Z 
2026-05-16T05:07:11.9588755Z === Lint: deploy-stack test ===
2026-05-16T05:07:11.9589524Z >>> pnpm lint:deploy-stack:test
2026-05-16T05:07:12.2869249Z 
2026-05-16T05:07:12.2870760Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-16T05:07:12.2871940Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-16T05:07:12.2872495Z 
2026-05-16T05:07:12.3541041Z PASS: lint-deploy-stack green
2026-05-16T05:07:12.3690296Z 
2026-05-16T05:07:12.3691110Z === ADR 0005 lint ===
2026-05-16T05:07:12.3691957Z >>> pnpm lint:adr:0005
2026-05-16T05:07:12.6964330Z 
2026-05-16T05:07:12.6965526Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-16T05:07:12.6967042Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-16T05:07:12.6967990Z 
2026-05-16T05:07:12.7281644Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T05:07:12.7415820Z 
2026-05-16T05:07:12.7416651Z === ADR 0006 lint ===
2026-05-16T05:07:12.7417799Z >>> pnpm lint:adr:0006
2026-05-16T05:07:13.0636924Z 
2026-05-16T05:07:13.0638045Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-16T05:07:13.0640768Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-16T05:07:13.0641901Z 
2026-05-16T05:07:13.0976274Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T05:07:13.1107208Z 
2026-05-16T05:07:13.1107956Z === Workspace: test ===
2026-05-16T05:07:13.1108775Z >>> pnpm -r test
2026-05-16T05:07:13.4430476Z Scope: 5 of 6 workspace projects
2026-05-16T05:07:13.4488668Z packages/db test$ vitest run
2026-05-16T05:07:13.4497626Z packages/game-logic test$ vitest run
2026-05-16T05:07:13.9879699Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T05:07:13.9901650Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T05:07:14.4462835Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T05:07:14.7000563Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T05:07:14.9383525Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:07:14.9962210Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T05:07:15.2238971Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:07:15.4492308Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:15.6744658Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:07:15.8912221Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:07:15.9202505Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T05:07:16.1406906Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:16.1469476Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T05:07:16.1491526Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T05:07:16.1500957Z packages/db test: [2m   Start at [22m 05:07:13
2026-05-16T05:07:16.1511513Z packages/db test: [2m   Duration [22m 2.15s[2m (transform 172ms, setup 0ms, import 1.47s, tests 32ms, environment 1ms)[22m
2026-05-16T05:07:16.1643748Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:16.1844888Z packages/db test: Done
2026-05-16T05:07:16.1871210Z packages/protocol test$ vitest run
2026-05-16T05:07:16.4092165Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:16.6747585Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:07:16.7046062Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T05:07:16.9178646Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:07:17.2322341Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-16T05:07:17.2401364Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:07:17.2533532Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T05:07:17.2550926Z packages/game-logic test: [2m      Tests [22m [1m[32m60 passed[39m[22m[90m (60)[39m
2026-05-16T05:07:17.2552390Z packages/game-logic test: [2m   Start at [22m 05:07:14
2026-05-16T05:07:17.2554075Z packages/game-logic test: [2m   Duration [22m 3.24s[2m (transform 260ms, setup 0ms, import 524ms, tests 119ms, environment 2ms)[22m
2026-05-16T05:07:17.2838429Z packages/game-logic test: Done
2026-05-16T05:07:17.4374030Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:07:17.6208597Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:07:17.7901093Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:07:17.7972497Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T05:07:17.7992223Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T05:07:17.8004301Z packages/protocol test: [2m   Start at [22m 05:07:16
2026-05-16T05:07:17.8006016Z packages/protocol test: [2m   Duration [22m 1.05s[2m (transform 161ms, setup 0ms, import 310ms, tests 47ms, environment 1ms)[22m
2026-05-16T05:07:17.8225381Z packages/protocol test: Done
2026-05-16T05:07:17.8232186Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T05:07:17.8235608Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T05:07:18.4212445Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T05:07:18.4727616Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T05:07:19.5652379Z apps/server test: {"level":30,"time":1778908039560,"pid":6065,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T05:07:19.5676700Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 795[2mms[22m[39m
2026-05-16T05:07:19.5711636Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 658[2mms[22m[39m
2026-05-16T05:07:20.2759623Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 194[2mms[22m[39m
2026-05-16T05:07:20.6719827Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T05:07:20.6762452Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T05:07:20.7554750Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 264[2mms[22m[39m
2026-05-16T05:07:21.2473172Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T05:07:21.2489130Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-SA1ySd/rebno.db
2026-05-16T05:07:21.2492770Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:07:21.2498826Z apps/server test: [run-migrations] OK
2026-05-16T05:07:21.2617531Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T05:07:21.2639657Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-cEkloE/rebno.db
2026-05-16T05:07:21.2642412Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:07:21.2644643Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T05:07:21.2646051Z apps/server test: [run-migrations] OK
2026-05-16T05:07:21.2742970Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T05:07:21.2761780Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ZbZTZT/rebno.db
2026-05-16T05:07:21.2778907Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:07:21.2791090Z apps/server test: [run-migrations] OK
2026-05-16T05:07:21.2812589Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T05:07:21.2831661Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ZbZTZT/rebno.db
2026-05-16T05:07:21.2851557Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T05:07:21.2877447Z apps/server test: [run-migrations] OK
2026-05-16T05:07:21.2881810Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 62[2mms[22m[39m
2026-05-16T05:07:22.0696819Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 156[2mms[22m[39m
2026-05-16T05:07:22.3602321Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 54[2mms[22m[39m
2026-05-16T05:07:22.7182261Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 37[2mms[22m[39m
2026-05-16T05:07:23.0392147Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T05:07:23.3085487Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-16T05:07:23.3562472Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 160[2mms[22m[39m
2026-05-16T05:07:23.5967217Z apps/server test: {"level":40,"time":1778908043587,"pid":6188,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:07:23.6033301Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-16T05:07:23.6136950Z apps/server test: {"level":40,"time":1778908043594,"pid":6188,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:07:23.6171500Z apps/server test: {"level":40,"time":1778908043595,"pid":6188,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T05:07:23.8752523Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T05:07:24.1372407Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:07:24.8018144Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 124[2mms[22m[39m
2026-05-16T05:07:24.9931806Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T05:07:24.9943403Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ suppress logs { quiet: true }
2026-05-16T05:07:24.9996515Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T05:07:25.6934373Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T05:07:25.9498828Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:25.9584774Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T05:07:25.9601507Z apps/server test: [2m      Tests [22m [1m[32m71 passed[39m[22m[90m (71)[39m
2026-05-16T05:07:25.9620984Z apps/server test: [2m   Start at [22m 05:07:18
2026-05-16T05:07:25.9622644Z apps/server test: [2m   Duration [22m 7.52s[2m (transform 593ms, setup 0ms, import 3.48s, tests 1.25s, environment 2ms)[22m
2026-05-16T05:07:26.0135018Z apps/server test: Done
2026-05-16T05:07:26.0385913Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 113[2mms[22m[39m
2026-05-16T05:07:26.8161374Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 81[2mms[22m[39m
2026-05-16T05:07:27.5867991Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 80[2mms[22m[39m
2026-05-16T05:07:28.3349261Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 43[2mms[22m[39m
2026-05-16T05:07:29.0710596Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 44[2mms[22m[39m
2026-05-16T05:07:29.7795358Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T05:07:30.5138522Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T05:07:31.2354814Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-16T05:07:31.9563488Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T05:07:32.6883411Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T05:07:33.4444397Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T05:07:34.1376883Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:34.8423663Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T05:07:35.5479909Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:36.2596895Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T05:07:36.9874082Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:07:37.7083156Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T05:07:38.4569579Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T05:07:39.1799480Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:07:39.9007961Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:07:40.5962256Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:07:41.3059971Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:07:41.9988944Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T05:07:42.7007873Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:07:43.4071681Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:07:44.1496528Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T05:07:44.8492300Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T05:07:44.8722055Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T05:07:44.8750871Z apps/client test: [2m      Tests [22m [1m[32m216 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (220)[39m
2026-05-16T05:07:44.8752204Z apps/client test: [2m   Start at [22m 05:07:18
2026-05-16T05:07:44.8753841Z apps/client test: [2m   Duration [22m 26.40s[2m (transform 920ms, setup 85ms, collect 1.67s, tests 1.27s, environment 15.25s, prepare 2.92s)[22m
2026-05-16T05:07:45.0178747Z apps/client test: Done
2026-05-16T05:07:45.0257764Z 
2026-05-16T05:07:45.0258977Z verify-phase-5: OK (7 steps green)
